package com.tdxy.util;

import java.sql.*;

/**
 * 数据库操作的工具类
 * 当前工具类, 实现一个重复性的代码简化、抽取。使程序更健壮。
 */
public class DBUtil {
    // 如果常量不需要所有类都能访问, 只在本类访问的话, 那么设置成私有化。
    private static final String URL = "jdbc:mysql://127.0.0.1:3309/db_tdxy";
    private static final String USER = "root";
    private static final String PWD = "root";    // 压缩包mysql数据库密码应该是 root@123

    // 静态块 静态块的作用就是Java程序运行的开始就需要执行的代码, 可以放在静态块中, 。
    {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接对象
     *
     * @return 数据库连接对象
     */
    public static Connection getConnection() {
        try {
            return DriverManager.getConnection(URL, USER, PWD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 对数据进行增、删、改的方法
     *
     * @return 操作了几行数据 目前返回值应该是 1
     */
    public static int execute(String sql, Object... objs) {
        Connection conn = getConnection();
        try {
            PreparedStatement pstat = conn.prepareStatement(sql);
            for (int i = 0; i < objs.length; i++) {
                pstat.setObject(i + 1, objs[i]);
            }
            int i = pstat.executeUpdate();
            close(conn, pstat);
            return i;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 流的关半方法
     *
     * @param conn 数据库连接对象
     * @param stat 数据表操作对象
     */
    public static void close(Connection conn, Statement stat) {
        try {
            stat.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 流的关半方法
     *
     * @param conn 数据库连接对象
     * @param stat 数据表操作对象
     * @param res  返回的查询结果对象
     */
    public static void close(Connection conn , Statement stat , ResultSet res){
        try {
            res.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(conn,stat);
        }
    }

}
